
import numpy as np
import json
# import sklearn
import math

# 废弃 复制的
# 按二维数组处理  横向滑动  由左向右滑动(需要时间维度横向发展)  取正方形(如果数组行数大于窗口长度会丢掉最后几行)
# def 横向滑窗(数组, 窗口长度, 标签所属通道下标):
#     通道数 = len(数组[0][0])
#     total = np.asarray(数组).shape[1] - 窗口长度
#     x_train = []
#     y_train = []
#     for 滑块起始点 in range(0, total):
#         item = np.zeros((窗口长度, 窗口长度, 通道数))
#         for 行 in range(0, 窗口长度):
#             for 滑块长度 in range(0, 窗口长度):
#                 item[行][滑块长度] = 数组[行][滑块起始点 + 滑块长度]
#                 if 行 == 0 and 滑块长度 == (窗口长度 - 1):
#                     y_train.append([数组[0][滑块起始点 + 滑块长度 + 1][标签所属通道下标] - 数组[0][滑块起始点 + 滑块长度][标签所属通道下标]])
#         x_train.append(item)
#
#     # 混洗三遍 不混洗可能会导致过拟合, 即训练准确率高而验证准确率低
#     x_train, y_train = sklearn.utils.shuffle(x_train, y_train)
#     x_train, y_train = sklearn.utils.shuffle(x_train, y_train, random_state=5)
#     x_train, y_train = sklearn.utils.shuffle(x_train, y_train, random_state=9)
#     # 标签必须为正数(+ 最小值)
#     min = np.min(y_train)
#     # 偏移 为了保证标签为正 如果最小值为负 需要把所有标签都减去最小值  这个最小值作为偏移量 用来修正输出y
#     offset = 0
#     if min < 0:
#         offset = min
#         for y in range(0, len(y_train)):
#             y_train[y] = y_train[y] - min
#     # 分类任务的话  由于0也算一位所以分类数量要和最大值相同np.max(y_train) + 1
#     return np.max(y_train) + 1, offset, x_train, y_train

# 引用的
def 横向滑窗_引用(数组, 窗口长度, 标签所属通道下标):
    total = np.asarray(数组).shape[1] - 窗口长度
    x_train = []
    y_train = []
    for 滑块起始点 in range(0, total):
        # array 截取行列语法 A[line_start_index : line_stop_index, column_start_index : column_stop_index)]
        window_x = 数组[:, 滑块起始点:滑块起始点+窗口长度]
        x_train.append(window_x)
        window_y = 数组[0][滑块起始点+窗口长度][标签所属通道下标] - 数组[0][滑块起始点+窗口长度-1][标签所属通道下标]
        y_train.append([window_y])
    # 标签必须为正数(+ 最小值)
    min = np.min(y_train)
    # 偏移 为了保证标签为正 如果最小值为负 需要把所有标签都减去最小值  这个最小值作为偏移量 用来修正输出y
    offset = 0
    if min < 0:
        offset = math.floor(min)
        for y in range(0, len(y_train)):
            y_train[y][0] = y_train[y][0] - offset
    # 分类任务的话  由于0也算一位所以分类数量要和最大值相同np.max(y_train) + 1
    return np.max(y_train) + 1, offset, np.asarray(x_train), np.asarray(y_train)